package br.com.gustavobhz.portalcolaborador.pages.funcionario;

import java.util.Date;
import java.util.List;

import org.apache.tapestry5.ComponentResources;
import org.apache.tapestry5.EventConstants;
import org.apache.tapestry5.annotations.Component;
import org.apache.tapestry5.annotations.OnEvent;
import org.apache.tapestry5.annotations.Persist;
import org.apache.tapestry5.annotations.Property;
import org.apache.tapestry5.beaneditor.BeanModel;
import org.apache.tapestry5.corelib.components.Form;
import org.apache.tapestry5.hibernate.annotations.CommitAfter;
import org.apache.tapestry5.ioc.Messages;
import org.apache.tapestry5.ioc.annotations.Inject;
import org.apache.tapestry5.services.BeanModelSource;
import org.hibernate.Session;
import org.hibernate.exception.DataException;

import br.com.gustavobhz.portalcolaborador.dao.CrudServiceDAO;
import br.com.gustavobhz.portalcolaborador.entidade.Funcionario;
import br.com.gustavobhz.portalcolaborador.entidade.GenericDAO;

public class Cadastro {
	
	@Property
	@Persist
	private Funcionario funcionario;
	
	@Property
	private String nome;
	
	@Property
	private String cpf;
	
	@Property
	private Date dataAdmissao;
	
	@Property
	private String rg;
	
	@Property
	private String matricula;
	
	@Property
	private String pis;
	
	@Property
	private String funcao;
	
	@Property
	private String setor;
	
    @Property
    private boolean ativo = true;

	@Inject
	private Session session;
	
	@Inject
	private Messages messages;
	
	private GenericDAO dao;
	
    //BeanModel
    private BeanModel<Funcionario> funcionarioRow;
	
    @Inject
    private BeanModelSource beanModelSource;

	@Persist("flash")
	private String mensagemSucesso;

    @Inject
    private ComponentResources resources;
	
	@Persist("flash")
	private String message;
	
    @Component(id="cadastroFormFuncionario")
    private Form form;
	
    @Property
	private String contexto;
	
	@Property
	private long funcionarioId;
	
	@Inject
	private CrudServiceDAO crudDAO;
	
	private static final String MENSAGEM_SUCESSO = "sucesso";
	
	
	public void onActivate() {
		if(funcionario.getId() != null) {
			funcionario = new Funcionario();
		}
	}
	
	public void onActivate(String contexto) {
		if(contexto.equals("novo")) {
			funcionario = new Funcionario();
		}
	}

	//Formulário
	@OnEvent(component="cadastroFormFuncionario", value = EventConstants.SUCCESS)
	void onSuccess() {
		try {
	        gravar();
	        setMessage(messages.get(MENSAGEM_SUCESSO));
		} catch (DataException ex) {
			form.recordError("A operação não pode ser realizada, consulte o administrador do sistema.");
		}
	}
	 
	@CommitAfter
	void gravar() {
		dataAdmissao = new Date();
		this.funcionario.setNome(this.nome);
		this.funcionario.setCpf(this.cpf);
		this.funcionario.setDataAdmissao(this.dataAdmissao);
		this.funcionario.setRg(this.rg);
		this.funcionario.setMatricula(this.matricula);
		this.funcionario.setPis(this.pis);
		this.funcionario.setFuncao(this.funcao.toUpperCase());
		this.funcionario.setSetor(this.setor.toUpperCase());
		this.funcionario.setAtivo(this.ativo);
        final GenericDAO dao = new GenericDAO(session, Funcionario.class);
        dao.gravar(funcionario);
        funcionario = new Funcionario();
	}
	
    //Validando formulário
    public void onValidateFromCadastroFormFuncionario() {
    	
    	if(this.nome == null) {
    		form.recordError("O nome do funcionário deve ser preenchido.");
    	}
    	
    	if(this.cpf == null) {
    		form.recordError("O CPF do funcionário deve ser preenchido.");
    	}
    	
    	if(this.dataAdmissao == null) {
    		form.recordError("A data de admissão do funcionário deve ser preenchido.");
    	}
    	
    	if(this.rg == null) {
    		form.recordError("O RG do funcionário deve ser preenchido.");
    	}
    	
    	if(this.matricula == null) {
    		form.recordError("A matrícula do funcionário deve ser preenchido.");
    	}
    	if(this.pis == null) {
    		form.recordError("O PIS do funcionário deve ser preenchido.");
    	}
    	if(this.funcao == null) {
    		form.recordError("A função do funcionário deve ser preenchido.");
    	}
    	if(this.setor == null) {
    		form.recordError("O setor do funcionário deve ser preenchido.");
    	}
    	
    }//fim de validações no form
	
    //GRID - ROW
    public BeanModel<Funcionario> getModel() {
		BeanModel<Funcionario> model = beanModelSource.createDisplayModel(Funcionario.class, messages);
		 model.add("remover", null);
		 model.add("editar", null);
		 model.get("nome").sortable(false);
		return model;
    }
	
	//GRID
    public List<?> getListarFuncionario() {
        final GenericDAO dao = new GenericDAO(session, Funcionario.class);
        return dao.getList(); 
    }
    
    public void onActionFromRemover(long id) {
        remover(id);
    }
 
    @CommitAfter
    public void remover(long id) {
        final GenericDAO dao = new GenericDAO(session, Funcionario.class);
        dao.deleteById(id);
    }

    //getters and setters
	public Messages getMessages() {
		return messages;
	}

	public void setMessages(Messages messages) {
		this.messages = messages;
	}
	
	public String getMessage() {
		return message;
	}

	public void setMessage(String message) {
		this.message = message;
	}

	public BeanModel<Funcionario> getFuncionarioRow() {
		return funcionarioRow;
	}

	public void setFuncionarioRow(BeanModel<Funcionario> funcionarioRow) {
		this.funcionarioRow = funcionarioRow;
	}
	
	public GenericDAO getDao() {
		return dao;
	}

	public void setDao(GenericDAO dao) {
		this.dao = dao;
	}

}